import sys

import allure

from api.FlowInstance.approve_process import Approve_Process
from api.FlowInstance.create_process import Create_Process
from api.Organization.Organization_management import Organization_Management
from api import client
from api.OutsideApi.bpm_api import Bpm_Outside_Api
from api.OutsideApi.workflow_api import Workflow_Outside

sys.path.append("..")
# 对于模块和自己写的程序不在同一个目录下，可以把模块的路径通过sys.path.append(路径)添加到程序中。
# 在程序开头加上：
# import sys
# sys.path.append(’引用模块的地址')

class Login(client.HttpClient):
    def __init__(self,session=None):
        self.session=session
        super().__init__(self.session)

    """-------------------------------开始--------------------------------------------------"""
    "流程中心-登录"
    def get_secret_and_login(self, usercode, password):
        url = f'/demo/api/get-user-login?c={usercode}&p={password}'
        # AuthenticationHeader是demo相关请求的固定认证key
        headers = {'Content-Type': 'application/x-www-form-urlencoded',
                   'AuthenticationHeader': '3KRm34iGrJj4ZP05DJ5uz72V/vOy5itrcvutgFMywKPV8SBS5wVNaXfpAdX9ql8f'
                   }
        # 获取登录用户信息的jwt加密字符串
        response = self.send(url, headers=headers, method='get')
        if response.status_code==200:
            # 获取到加密字符串后，再进行登录
            login_body = f'login={response.text}'
            url = '/site/login'
            response = self.send(url, login_body, headers=headers, method='post')
            # 是否登录成功判断，如果失败则退出此用例
            if response.json()['success'] != 1:
                assert False, f'【{usercode}】登录失败！退出用例执行！'
        else:
            assert False,'获取用户jwt加密字符串失败，无法登录!'

    @allure.step('账号，密码正常登录')  # 测试报告显示步骤
    def goto_Organization_Management(self, usercode,password=1):
        """
        登录接口封装,跳转系统管理
        """
        self.get_secret_and_login(usercode, password)
        return Organization_Management(self.session)

    @allure.step('新建流程登录，账号，密码正常登录')  # 测试报告显示步骤
    def goto_Create_Process(self, usercode='',password=1):
        """
        登录接口封装，跳转新建流程
        """
        if usercode != '':
            self.get_secret_and_login(usercode, password)
        return Create_Process(self.session)

    @allure.step('审批流程登录，账号，密码正常登录')  # 测试报告显示步骤
    def goto_Approve_Process(self,usercode='',password=1):
        """
        登录接口封装，跳转审批流程
        """
        if usercode != '':
            self.get_secret_and_login(usercode, password)
        return Approve_Process(self.session)

    @allure.step('登录进入工作流外部接口')  # 测试报告显示步骤
    def goto_Outside_Api(self,usercode='',password=1):
        """
        如果传入usercode，是用于登录流程中心接口，以便请求流程中心接口来获取需要的数据，否则进入工作流外部接口，通过/wf/api/Common/Token接口，获取工作流Token进行登录。
        :param usercode:
        :param password: 默认1
        :return:
        """
        # 可能需要使用公共接口获取信息
        if usercode != "":
            self.get_secret_and_login(usercode, password)
        return Workflow_Outside(self.session)

    @allure.step('登录进入流程中心外部接口')  # 测试报告显示步骤
    def goto_Bpm_Outside_Api(self,usercode='',password=1):
        """
        进入流程中心外部接口类
        :param usercode:
        :param password:
        :return:
        """
        if usercode != "":
            self.get_secret_and_login(usercode, password)
        return Bpm_Outside_Api(self.session)
